package top.stmo;


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 *   ------------------------Response设置响应数据功能-------------------------
 *
 *   HTTP响应数据总共分为三部分内容，分别是响应行、响应头、响应体
 *
 *   响应行：
 *      HTTP/1.1 200 OK
 *
 *      void setStatus(int sc)                          设置响应状态码
 *
 *   响应头：
 *      void setHeader(String name,String value)        设置响应头键值对
 *
 *   响应体：
 *      PrintWriter getWriter()                         获取字符输出流
 *      ServletOutputStream getOutputStream()           获取字节输出流
 *
 *    -------------------------Response请求重定向--------------------------
 *
 *      浏览器发送请求给服务器，服务器中对应的资源A接收到请求
 *      资源A现在无法处理该请求，就会给浏览器响应一个302的状态码+location的一个访问资源B的路径
 *      浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B
 *      资源B接收到请求后进行处理并最终给浏览器响应结果，这整个过程就叫重定向
 *
 *      重定向的实现方式：
 *          resp.setStatus(302)
 *          resp.setHeader("location","资源B的访问路径")
 *
 *     重定向的简化实现方式：
 *          resp.sendRedirect("资源B的访问路径");
 *
 *
 *    重定向的特点：                                  请求转发的特点：
 *    浏览器地址栏路径发生变化                          浏览器地址栏路径不发生变化
 *    可以重定向到任意位置的资源（服务器内部、外部均可）      只能转发到当前服务器的内部资源
 *    两次请求，不能在多个资源使用request共享数据          一次请求，可以在转发的资源间使用request共享数据
 *
 *    路径问题：
 *    浏览器使用:需要加虚拟目录(项目访问路径)
 *    服务端使用:不需要加虚拟目录
 *
 *    对于转发来说，因为是在服务端进行的，所以不需要加虚拟目录
 *    对于重定向来说，路径最终是由浏览器来发送请求，就需要添加虚拟目录。
 *
 *      //简化方式完成重定向
 *      //动态获取虚拟目录
 *      String contextPath = request.getContextPath();
 *      response.sendRedirect(contextPath+"/resp2");
 */
@WebServlet("/rsp1")
public class Response1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                                            throws ServletException, IOException {
        System.out.println("Response1");

        //重定向
//        resp.setStatus(302);
//        resp.setHeader("location","/rsp2");

        resp.sendRedirect("/rsp2");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                                            throws ServletException, IOException {
        doGet(req,resp);
    }
}
